package com.example.response.entity;

import com.example.response.annotation.ExceptionCodeAnnotation;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@ApiModel(value = "user", description = "用户实体类")
@Data ////注解在类上；提供类所有属性的 getting 和 setting 方法，此外还提供了equals、canEqual、hashCode、toString 方法
public class User {
    @ApiModelProperty(value = "id", required = true)
    @NotNull(message = "id不能为空") //long类型的，不能被@NotEmpty修饰
    private long id;
    @Size(min = 6, max = 12, message = "昵称长度必须是6-12个字符") //包含非空校验
    @ExceptionCodeAnnotation(code = 10003, message = "昵称长度必须是6-12个字符aaaaaaaa")
    private String nickName;
    /**
     * 注意：boolean类型的属性名不要起is开头的，因为框架解析的时候会把属性值解析为is后面的内容，而传入的值里面是没有Adult的，
     *  导致isAdult一直是false的问题。
     * 解决方式（任一可解决）：
     *  1.isAdult改为非is开头的属性名
     *  2.传值的时候传adult，不要传isAdult
     */
    @ApiModelProperty(required = true, notes = "返回成年与否", example = "true")
    @NotNull
    private boolean isAdult;
    @NotEmpty(message = "邮箱不能为空")
    @Email(message = "邮箱格式不正确") //不包含非空校验，所以需要@NotEmpty来校验非空
    @ExceptionCodeAnnotation(code = 10004, message = "邮箱验证错误，你知道吗") //自定义注解来灵活控制校验失败后的响应码和响应信息
    private String email;

    /**
     * 空检查
     * @Null 验证对象是否为null
     * @NotNull 验证对象是否不为null, 无法查检长度为0的字符串(不能为null，但可以为empty(分配了内存空间，但值为空))
     * @NotBlank 检查约束'字符串'是不是Null及被Trim的长度是否大于0.
     * @NotEmpty 检查约束'字符串'是否为NULL或者是EMPTY.
     *
     * Booelan检查
     * @AssertTrue 验证 Boolean 对象是否为 true
     * @AssertFalse 验证 Boolean 对象是否为 false
     *
     * 长度检查
     * @Size(min=, max=)		验证对象（Array,Collection,Map,String）长度是否在给定的范围之内
     * @Length(min=, max=)		验证注解的元素值长度在min和max区间内
     *
     * 日期检查
     * @Past 验证 Date 和 Calendar 对象是否在当前时间之前
     * @Future 验证 Date 和 Calendar 对象是否在当前时间之后
     * @Pattern 验证 String 对象是否符合正则表达式的规则
     *
     * 数值检查，建议使用在Stirng,Integer类型，不建议使用在int类型上，因为表单值为“”时无法转换为int，但可以转换为Stirng为"",Integer为null
     * @Min 验证 Number 和 String 对象是否大等于指定的值
     * @Max 验证 Number 和 String 对象是否小等于指定的值
     * @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
     * @DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
     * @Digits 验证 Number 和 String 的构成是否合法
     * @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字，interger指定整数精度，fraction指定小数精度。
     *
     * @Range(min=, max=)	验证注解的元素值在最小值和最大值之间
     * @Range(min=10000,max=50000,message="range.bean.wage")
     * private BigDecimal wage;
     *
     * @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
     * @CreditCardNumber信用卡验证
     * @Email 验证是否是邮件地址，如果为null,不进行验证，算通过验证。
     * @ScriptAssert(lang= , script=, alias=)
     * @URL(protocol=,host=, port=,regexp=, flags=)
     */

}
